Xayrga wiki https://xayr.ga/wiki/Main_Page MediaWiki 1.37.1 first-letter Media Special Talk User User talk Xayrga Xayrga talk File File talk MediaWiki MediaWiki talk Template Template talk Help Help talk Category Category talk Main Page 0 1 1 2022-03-11T21:37:14Z MediaWiki default 2 wikitext text/x-wiki <strong>MediaWiki has been installed.</strong> Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software. == Getting started == * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ] * [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki] 11cef88175cf81168a86e7c0327a5b2d7a1920f5 2 1 2022-03-12T02:36:30Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Sega Dreamcast] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Nintendo Gamecube / Nintendo Wii] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Nintendo 64] 4d135d124e78033dadbe3dc43219712cebf5f7ff 3 2 2022-03-12T02:36:56Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Sega Dreamcast] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo Gamecube / Nintendo Wii] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo 64] 504a6fdcad6181716120f538ad5b332f36ea23a1 7 3 2022-03-12T02:41:03Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Sega Dreamcast] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo Gamecube + Wii Audio] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo 64] 84014f0202ac413efe0243fc23f6fbf8b1daa041 8 7 2022-03-12T02:41:16Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Sega Dreamcast] * [https://xayr.ga/research/index.php/Nintendo_Gamecube: Nintendo Gamecube + Wii Audio] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo 64] ce22adedb064f2d4c206ac2f5ec13b01c5dc9cfe 9 8 2022-03-12T02:41:35Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Sega Dreamcast] * [https://xayr.ga/research/index.php/Nintendo_Gamecube :Nintendo Gamecube + Wii Audio] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo 64] 84960d2d3524b67ed7e193f5fd6856421976cc23 10 9 2022-03-12T02:41:45Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Sega Dreamcast] * [https://xayr.ga/research/index.php/Nintendo_Gamecube : Nintendo Gamecube + Wii Audio] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo 64] e37bd046ef67f89935389619c5d156439719e90e 11 10 2022-03-12T02:41:56Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Sega Dreamcast] * [https://xayr.ga/research/index.php/Nintendo_Gamecube: Nintendo Gamecube + Wii Audio] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual: Nintendo 64] ce22adedb064f2d4c206ac2f5ec13b01c5dc9cfe 12 11 2022-03-12T02:45:43Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. <h2>Consoles</h2> * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Sega Dreamcast] * [https://xayr.ga/research/index.php/Nintendo_Gamecube:Nintendo Gamecube + Wii Audio] * [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Nintendo 64] 5fda8eb02f0e9b03ea9a3dd265c1e6f81dabdc02 13 12 2022-03-12T02:49:27Z Xayr 1 wikitext text/x-wiki <strong>Oh, hi</strong> I'm Xayr. I break computers. Look at some of my stuff below. <h1>R/E Projects</h1> Reverse engineering projects. Lists of various formats for some consoles, usually audio formats. aaadbeacfa104cbd4d26cc1ae174e306fddf2d6a Nintendo Gamecube 0 3 6 2022-03-12T02:40:19Z Xayr 1 Created page with "Yes" wikitext text/x-wiki Yes 5397e0583f14f6c88de06b1ef28f460a1fb5b0ae Category:JAudio 14 5 15 2022-03-12T02:54:34Z Xayr 1 Created page with "JAudio is the audio subsystem used on select first-party Nintendo titles on the GameCube and Wii It was delivered in two versions, v1 and v2 with slight variations between both." wikitext text/x-wiki JAudio is the audio subsystem used on select first-party Nintendo titles on the GameCube and Wii It was delivered in two versions, v1 and v2 with slight variations between both. 0ba7d0c461c2998c0e08f1af809b29b43f2b450e JAudio1 0 6 16 2022-03-12T02:57:36Z Xayr 1 Created page with "First" wikitext text/x-wiki First 916a78d701ded328cd66da58a97ef8cd28a99e84 JAudiov1 0 7 17 2022-03-12T03:02:36Z Xayr 1 Created page with "[[Category:JAudio]] <h1>JAudio V1</h1> JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin" wikitext text/x-wiki [[Category:JAudio]] <h1>JAudio V1</h1> JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin c0c2cef436568596a0e81084b91949c6b9341499 18 17 2022-03-12T03:05:47Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> 97efd3f513dec3d3b7bcbe1ccf1a4f885c9b99b2 19 18 2022-03-12T03:08:33Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> [[AAF]] [[AW]] [[BAS (J3D)]] [[BARC]] [[BMS]] [[HED]] [[IBNK]] [[WSYS]] b4f194fb2b1ec0aafddf00d6961acd8d5619a6e9 20 19 2022-03-12T03:08:48Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> * [[AAF]] * [[AW]] * [[BAS (J3D)]] * [[BARC]] * [[BMS]] * [[HED]] * [[IBNK]] * [[WSYS]] c5e711eada9afea967573cf63bdc4e863bcb5f4f 21 20 2022-03-12T03:09:24Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> * [[AAF]] * [[AW]] * [[BAS (J3D)]] * [[BARC]] * [[BMS]] * [[BST]] * [[HED]] * [[IBNK]] * [[SFT]] * [[WSYS]] 9a95306f9bdd4cb0f107a28664f5dcff1790a8e8 22 21 2022-03-12T03:10:10Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> * [[AAF]] * [[AW]] * [[AFC]] * [[BAS (J3D)]] * [[BARC]] * [[BMS]] * [[BST]] * [[HED]] * [[IBNK]] * [[SFT]] * [[WSYS]] bd34c40ae35b772837b85e0654badfe8fe36f7d1 46 22 2022-03-12T04:11:16Z 108.162.237.140 0 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> * [[AAF]] * [[AW]] * [[AFC]] * [[ASN]] * [[BAS (J3D)]] * [[BARC]] * [[BMS]] * [[BST]] * [[HED]] * [[IBNK]] * [[SFT]] * [[WSYS]] 0e0008bf828dcf049078ff537bf826ad98196c65 AAF 0 8 23 2022-03-12T03:11:44Z Xayr 1 Created page with "'''AAF''' stores sound effect, wave, instrument, and music data. =AAF Header= The file's headers is composed to several int32's packed in a common format. The first int32 will always read the ID of a section. When you read 0, you stop reading. Header Entry Structure {| class="wikitable" |- ! id !! Structure !! Description |- | <center>0</center> || (none) || Tells to stop reading this section |- | <center>1</center> || (int32 offset, int32 size, int32 t..." wikitext text/x-wiki '''AAF''' stores sound effect, wave, instrument, and music data. =AAF Header= The file's headers is composed to several int32's packed in a common format. The first int32 will always read the ID of a section. When you read 0, you stop reading. Header Entry Structure {| class="wikitable" |- ! id !! Structure !! Description |- | <center>0</center> || (none) || Tells to stop reading this section |- | <center>1</center> || (int32 offset, int32 size, int32 type) || Pointer to the BST (Binary Sound Table) |- | <center>2</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || IBNK Pointer Table |- | <center>3</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || WSYS Pointer Table |- | <center>4</center> || (int32 offset, int32 size, int32 type) || Pointer to BSC (Binary Sequence Collection) |- | <center>5</center> || (int32 offset, int32 size, int32 type) || Pointer to the BSM (Binary Stream Map) |} === Sample Parsing Code === <nowiki>while (true) { var ChunkID = aafRead.ReadUInt32(); switch (ChunkID) { case 0: return; case 1: case 5: case 4: case 6: case 7: { offset = aafRead.ReadUInt32(); size = aafRead.ReadUInt32(); type = aafRead.ReadUInt32(); break; } case 2: // INST { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } } break; case 3: // WSYS { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } break; } } }</nowiki> =IBNK= IBNK Stands for "Instrument Bank". It holds the parameters required to play one of the sounds out of the WSYS as a melodic instrument. They can also contain sound effects. All pointers are relative to the 0th byte of the IBNK ==Header== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x49424e4b 'IBNK' || Magic |- | <center>0x04</center> || int32 || Size || Size of the IBNK |- | <center>0x08</center> || int32 || ID || Global IBNK ID |- | <center>0x0C</center> || int32 || Flags || Flags |- | <center>0x10</center> || byte[0x14] || Padding || Padding |- | <center>0x24</center> || int32 || 0x42414E4B 'BANK' || Magic |- | <center>0x28</center> || int32*[0xF0] || Instrument Pointers || Pointers to instrument objects (0 = empty slot) |- |} ==INST== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x494E5354 'INST' || Magic |- | <center>0x04</center> || int32 || 0 || Zero (Padding) |- | <center>0x08</center> || float || frequencyMultiplier || Frequency Multiplier |- | <center>0x0C</center> || float || gainMultiplier || gainMultiplier |- | <center>0x10</center> || int32* || Osc1* || Pointer to first [[AAF#JOscillator|JOscillator]] (0 = null) |- | <center>0x14</center> || int32* || Osc2* || Pointer to second [[AAF#JOscillator|JOscillator]](0 = null) |- | <center>0x18</center> || int32* || Eff1* || Pointer to first Effect (0 = null) |- | <center>0x1C</center> || int32* || Eff2* || Pointer to second Effect (0 = null) |- | <center>0x20</center> || int32* || Sen1* || Pointer to first sensor (0 = null) |- | <center>0x24</center> || int32* || Sen2* || Pointer to second swnsor (0 = null) |- | <center>0x28</center> || int32 || keyRegionCount || Count of key regions |- | <center>0x2C</center> || [[AAF#InstrumentKeyRegion|InstrumentKeyRegion]]*[keyRegionCount] || Key Regions || int32 pointers to key regions |- |} ===InstrumentKeyRegion=== Container for an instruments keys. Usually there's only one. The "root key" item defines the key this specific key object is assigned to. By default, it starts at 0. The next definition fills all the keys in betwen, meaning if the next root key was 127, the keys at 0-127 would be assigned to that region. A single key has two parts to it. The note, and the velocity. The note is specified by the key region, and the velocity regions are defined by attaching them to key regions. Velocity regions, being the final part of the sound, handle the finetuning, and wave selection. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || bKey || base Key |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || int32 || velocityRegionCount || Count of velocity regions |- | <center>0x08</center> || [[AAF#InstrumentVeloRegion|InstrumentVeloRegion]]*[velocityRegionCount] || velregptr || Int32 pointers to each velocity region. |- |} ====InstrumentVeloRegion==== The velocity region of a KeyRegion. The "root velocity" operates identically to the Key Region. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || bKey || root velocity |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || short || wsysID || WSYS that the sound for this instrument is in. |- | <center>0x06</center> || short || waveID || WaveID in the WSYS that the sound for this instrument is in. |- | <center>0x08</center> || float || gainMultFT || Finetune float for gain / volume |- | <center>0x0C</center> || float || freqMultFT || Finetune float for pitch / frequency |- |} ==PER2== A type of INST that doesn't have a pitch or gain on the main instrument, or as many features (like oscillators) {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x50455232 'PER2' || Magic |- | <center>0x04</center> || byte[0x84] || 0 || Unused |- | <center>0x8C</center> || [[AAF#PercussionKey|PercussionKey]]*[100] || 100 percussion entries || Int32 pointers to percussion keys |- |} ===PercussionKey=== Key type for PER2's instrument data (Not regioned) {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || float || pitch || Finetune Pitch |- | <center>0x04</center> || float || volume || Finetune Gain |- | <center>0x08</center> || byte[8] || unused || unused |- | <center>0x10</center> || int32 || velocityRegionCount || Count of velocity regions |- | <center>0x14</center> || [[AAF#InstrumentVeloRegion|InstrumentVeloRegion]]*[velocityRegionCount] || velregptr || Int32 Pointers to each velocity region. |- |} ==JOscillator== JAITOscillator is an internal name. It stands for JAudioInterface:TOscillator. They have no header data, and no other identifying data. , they are pointed to directly by INST objects. The width and vertex operators are used mainly for effects like vibrato. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || [[AAF#JOscillatorMode|JOscillatorMode]] || Mode / Target |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || float || rate || rate |- | <center>0x08</center> || int32* || attackEnvOffset || Int32 pointer to attack [[AAF#JEnvelope|JEnvelope]] |- | <center>0x0C</center> || int32* || releaseEnvOffset || Int32 pointer to release [[AAF#JEnvelope|JEnvelope]] |- | <center>0x10</center> || float || width || Width of the oscillator |- | <center>0x14</center> || float || vertex || Vertex of the oscillator |- |} ===JOscillatorMode=== Different modes that the JOscillator can target. {| class="wikitable" |- ! mode !! Name !! Desc |- | <center>0x01</center> || Volume || Changes volume of instrument |- | <center>0x02</center> || Pitch || Changes pitch of instrument |- | <center>0x03</center> || Pan || Changes pan of instrument |- | <center>0x04</center> || FX || Changes filter |- | <center>0x05</center> || Dolby || (Unused) for digital sound output / dolby surround |- |} ===JEnvelope=== JEnvelopes are only referenced by a [[AAF#JOscillator|JOscillator]]. Similar to their parent, they have no identifying header data. In addition, they have no static length. They are ended by an end marker (Which in practice, will require a double scan) A JEnvelope is composed of vectors with modes with a structure as follows: {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || short || [[AAF#JEnvelopeMode|JEnvelopeMode]] || Mode selection for this vector |- | <center>0x02</center> || short || time || Time that this takes place (In ticks) |- | <center>0x06</center> || short || value || Value of this vector at this time |- | <center>0x10</center> || int32 || velocityRegionCount || Count of velocity regions |- |} ====JEnvelopeMode==== {| class="wikitable" |- ! mode !! Name !! Desc |- | <center>0x00</center> || Linear || Linear approach to the next vector value |- | <center>0x01</center> || Square || Square curve approach to the next vector value |- | <center>0x02</center> || Square || Square Root (n^0.5) curve approach to the next vector value |- | <center>0x03</center> || SampleCell || Unknown, (Unused?) |- | <center>0x0D</center> || Loop || Command vector, defines a loop point |- | <center>0x0E</center> || Hold || Pauses the envelope, usually used after it completes |- | <center>0x0F</center> || Stop || Stops both the instrument and the envelope |- |} =WSYS= Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[AAF#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[AAF#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[AAF#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 4931cf4c6e6d265bdbb4182c14fa8cf50783e8cd 24 23 2022-03-12T03:12:47Z Xayr 1 wikitext text/x-wiki '''AAF''' stores sound effect, wave, instrument, and music data. =AAF Header= The file's headers is composed to several int32's packed in a common format. The first int32 will always read the ID of a section. When you read 0, you stop reading. Header Entry Structure {| class="wikitable" |- ! id !! Structure !! Description |- | <center>0</center> || (none) || Tells to stop reading this section |- | <center>1</center> || (int32 offset, int32 size, int32 type) || Pointer to the BST (Binary Sound Table) |- | <center>2</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || IBNK Pointer Table |- | <center>3</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || WSYS Pointer Table |- | <center>4</center> || (int32 offset, int32 size, int32 type) || Pointer to BSC (Binary Sequence Collection) |- | <center>5</center> || (int32 offset, int32 size, int32 type) || Pointer to the BSM (Binary Stream Map) |} === Sample Parsing Code === <nowiki>while (true) { var ChunkID = aafRead.ReadUInt32(); switch (ChunkID) { case 0: return; case 1: case 5: case 4: case 6: case 7: { offset = aafRead.ReadUInt32(); size = aafRead.ReadUInt32(); type = aafRead.ReadUInt32(); break; } case 2: // INST { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } } break; case 3: // WSYS { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } break; } } }</nowiki> =IBNK= IBNK Stands for "Instrument Bank". It holds the parameters required to play one of the sounds out of the WSYS as a melodic instrument. They can also contain sound effects. All pointers are relative to the 0th byte of the IBNK ==Header== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x49424e4b 'IBNK' || Magic |- | <center>0x04</center> || int32 || Size || Size of the IBNK |- | <center>0x08</center> || int32 || ID || Global IBNK ID |- | <center>0x0C</center> || int32 || Flags || Flags |- | <center>0x10</center> || byte[0x14] || Padding || Padding |- | <center>0x24</center> || int32 || 0x42414E4B 'BANK' || Magic |- | <center>0x28</center> || int32*[0xF0] || Instrument Pointers || Pointers to instrument objects (0 = empty slot) |- |} ==INST== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x494E5354 'INST' || Magic |- | <center>0x04</center> || int32 || 0 || Zero (Padding) |- | <center>0x08</center> || float || frequencyMultiplier || Frequency Multiplier |- | <center>0x0C</center> || float || gainMultiplier || gainMultiplier |- | <center>0x10</center> || int32* || Osc1* || Pointer to first [[AAF#JOscillator|JOscillator]] (0 = null) |- | <center>0x14</center> || int32* || Osc2* || Pointer to second [[AAF#JOscillator|JOscillator]](0 = null) |- | <center>0x18</center> || int32* || Eff1* || Pointer to first Effect (0 = null) |- | <center>0x1C</center> || int32* || Eff2* || Pointer to second Effect (0 = null) |- | <center>0x20</center> || int32* || Sen1* || Pointer to first sensor (0 = null) |- | <center>0x24</center> || int32* || Sen2* || Pointer to second swnsor (0 = null) |- | <center>0x28</center> || int32 || keyRegionCount || Count of key regions |- | <center>0x2C</center> || [[AAF#InstrumentKeyRegion|InstrumentKeyRegion]]*[keyRegionCount] || Key Regions || int32 pointers to key regions |- |} ===InstrumentKeyRegion=== Container for an instruments keys. Usually there's only one. The "root key" item defines the key this specific key object is assigned to. By default, it starts at 0. The next definition fills all the keys in betwen, meaning if the next root key was 127, the keys at 0-127 would be assigned to that region. A single key has two parts to it. The note, and the velocity. The note is specified by the key region, and the velocity regions are defined by attaching them to key regions. Velocity regions, being the final part of the sound, handle the finetuning, and wave selection. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || bKey || base Key |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || int32 || velocityRegionCount || Count of velocity regions |- | <center>0x08</center> || [[AAF#InstrumentVeloRegion|InstrumentVeloRegion]]*[velocityRegionCount] || velregptr || Int32 pointers to each velocity region. |- |} ====InstrumentVeloRegion==== The velocity region of a KeyRegion. The "root velocity" operates identically to the Key Region. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || bKey || root velocity |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || short || wsysID || WSYS that the sound for this instrument is in. |- | <center>0x06</center> || short || waveID || WaveID in the WSYS that the sound for this instrument is in. |- | <center>0x08</center> || float || gainMultFT || Finetune float for gain / volume |- | <center>0x0C</center> || float || freqMultFT || Finetune float for pitch / frequency |- |} ==PER2== A type of INST that doesn't have a pitch or gain on the main instrument, or as many features (like oscillators) {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x50455232 'PER2' || Magic |- | <center>0x04</center> || byte[0x84] || 0 || Unused |- | <center>0x8C</center> || [[AAF#PercussionKey|PercussionKey]]*[100] || 100 percussion entries || Int32 pointers to percussion keys |- |} ===PercussionKey=== Key type for PER2's instrument data (Not regioned) {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || float || pitch || Finetune Pitch |- | <center>0x04</center> || float || volume || Finetune Gain |- | <center>0x08</center> || byte[8] || unused || unused |- | <center>0x10</center> || int32 || velocityRegionCount || Count of velocity regions |- | <center>0x14</center> || [[AAF#InstrumentVeloRegion|InstrumentVeloRegion]]*[velocityRegionCount] || velregptr || Int32 Pointers to each velocity region. |- |} ==JOscillator== JAITOscillator is an internal name. It stands for JAudioInterface:TOscillator. They have no header data, and no other identifying data. , they are pointed to directly by INST objects. The width and vertex operators are used mainly for effects like vibrato. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || [[AAF#JOscillatorMode|JOscillatorMode]] || Mode / Target |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || float || rate || rate |- | <center>0x08</center> || int32* || attackEnvOffset || Int32 pointer to attack [[AAF#JEnvelope|JEnvelope]] |- | <center>0x0C</center> || int32* || releaseEnvOffset || Int32 pointer to release [[AAF#JEnvelope|JEnvelope]] |- | <center>0x10</center> || float || width || Width of the oscillator |- | <center>0x14</center> || float || vertex || Vertex of the oscillator |- |} ===JOscillatorMode=== Different modes that the JOscillator can target. {| class="wikitable" |- ! mode !! Name !! Desc |- | <center>0x01</center> || Volume || Changes volume of instrument |- | <center>0x02</center> || Pitch || Changes pitch of instrument |- | <center>0x03</center> || Pan || Changes pan of instrument |- | <center>0x04</center> || FX || Changes filter |- | <center>0x05</center> || Dolby || (Unused) for digital sound output / dolby surround |- |} ===JEnvelope=== JEnvelopes are only referenced by a [[AAF#JOscillator|JOscillator]]. Similar to their parent, they have no identifying header data. In addition, they have no static length. They are ended by an end marker (Which in practice, will require a double scan) A JEnvelope is composed of vectors with modes with a structure as follows: {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || short || [[AAF#JEnvelopeMode|JEnvelopeMode]] || Mode selection for this vector |- | <center>0x02</center> || short || time || Time that this takes place (In ticks) |- | <center>0x06</center> || short || value || Value of this vector at this time |- | <center>0x10</center> || int32 || velocityRegionCount || Count of velocity regions |- |} ====JEnvelopeMode==== {| class="wikitable" |- ! mode !! Name !! Desc |- | <center>0x00</center> || Linear || Linear approach to the next vector value |- | <center>0x01</center> || Square || Square curve approach to the next vector value |- | <center>0x02</center> || Square || Square Root (n^0.5) curve approach to the next vector value |- | <center>0x03</center> || SampleCell || Unknown, (Unused?) |- | <center>0x0D</center> || Loop || Command vector, defines a loop point |- | <center>0x0E</center> || Hold || Pauses the envelope, usually used after it completes |- | <center>0x0F</center> || Stop || Stops both the instrument and the envelope |- |} c1f078d47036ac77085d4f12fcab7a261d2023fa 44 24 2022-03-12T04:04:40Z Xayr 1 wikitext text/x-wiki '''AAF''' stores sound effect, wave, instrument, and music data. =AAF Header= The file's headers is composed to several int32's packed in a common format. The first int32 will always read the ID of a section. When you read 0, you stop reading. Header Entry Structure {| class="wikitable" |- ! id !! Structure !! Description |- | <center>0</center> || (none) || Tells to stop reading this section |- | <center>1</center> || (int32 offset, int32 size, int32 type) || Pointer to the BST (Binary Sound Table) |- | <center>2</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || IBNK Pointer Table |- | <center>3</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || WSYS Pointer Table |- | <center>4</center> || (int32 offset, int32 size, int32 type) || Pointer to BSC (Binary Sequence Collection) |- | <center>5</center> || (int32 offset, int32 size, int32 type) || Pointer to the BSM (Binary Stream Map) |} === Sample Parsing Code === <nowiki>while (true) { var ChunkID = aafRead.ReadUInt32(); switch (ChunkID) { case 0: return; case 1: case 5: case 4: case 6: case 7: { offset = aafRead.ReadUInt32(); size = aafRead.ReadUInt32(); type = aafRead.ReadUInt32(); break; } case 2: // INST { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } } break; case 3: // WSYS { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } break; } } }</nowiki> ceb5a1b4364b81b970df0b20e0e64b30649b6df2 WSYS 0 9 25 2022-03-12T03:13:07Z Xayr 1 Created page with "=WSYS= Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID..." wikitext text/x-wiki =WSYS= Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[AAF#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[AAF#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[AAF#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 89183bc848b781e36b9ccee8183ea67eec4661a8 26 25 2022-03-12T03:13:21Z Xayr 1 wikitext text/x-wiki '''WSYS''' Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[AAF#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[AAF#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[AAF#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 5e2444b62564e48209e770a6e6a037b402e8aad9 27 26 2022-03-12T03:14:32Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[AAF#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[AAF#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[AAF#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 4169eb43faf3701604e379df461c9f61ecd55a41 28 27 2022-03-12T03:16:54Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[AAF#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[AAF#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[AAF#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 71ff8c9ee05ce88d12711686e34385ddf814580d 29 28 2022-03-12T03:17:28Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[AAF#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[AAF#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[AAF#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 64da2ddf2376b21e55055c2332c706096736ab6a 30 29 2022-03-12T03:18:45Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF || WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF || WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} b0261f49cdbc95a72f24b075db0dddbc06afcd3f 31 30 2022-03-12T03:19:19Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 93a030e1d82c7f5f0c6f85058f727909904dfb43 32 31 2022-03-12T03:19:45Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || Flags |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ea589a5e8e6f0e70117991fc2ea7f65dac28cd08 33 32 2022-03-12T03:20:06Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || flags || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} e98f322143e779a58a3dbca5a8e63ed7c205bb1f 34 33 2022-03-12T03:20:19Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE || SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} b74b999b5f96ae73ee3cb0620371d5b2d63923af 35 34 2022-03-12T03:20:40Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'INF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 91d24b783910111eee7428b63c3b5e09207d53ee 36 35 2022-03-12T03:24:53Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} 30037c280a20180b259195b4f27677886fc2686d 37 36 2022-03-12T03:41:04Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==WAVE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} ea00b28db6f0fe6f8670bf5e3efe60119c8d06ce 38 37 2022-03-12T03:43:18Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==WAVE== Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} 9cbe29d9fad6762c57a3b81d68829665933ebbff 40 38 2022-03-12T03:47:00Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. Great part about WSYS is it doesn't matter what version of JAudio you're running. The WSYS format never changed between engine versions (minus the wave count int, but that doesn't matter because older versions just ignore it!) __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==WAVE== Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} f70f38c303fbae9868609795d83234e41a57794c 41 40 2022-03-12T03:53:40Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. Great part about WSYS is it doesn't matter what version of JAudio you're running. The WSYS format never changed between engine versions (minus the wave count int, but that doesn't matter because older versions just ignore it!) __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==WaveGroup== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x70] || archiveName || File Path for .AW |- | <center>0x04</center> || int32|| wavesCount || Wave Count |- | <center>0x08</center> || int32 || [[WSYS#WAVE|WAVE]]*[] || Pointer array of Waves |- |} ==WAVE== Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} f6db26d0e0c52fb55db9ec48d6556474c7585b65 42 41 2022-03-12T04:01:12Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. Great part about WSYS is it doesn't matter what version of JAudio you're running. The WSYS format never changed between engine versions (minus the wave count int, but that doesn't matter because older versions just ignore it!) __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==C-DF== C-DF , we don't know what it stands for, but we know that it assigns ID's to each of the waves in the scenes. Note: The other sections C-ST, and C-EX point to to this category as well. They remain empty. Code for parsing them isn't even in the executables. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x432D4446 ('C-DF') || Magic |- | <center>0x04</center> || int32 || wavesCount || Wave Count |- | <center>0x08</center> || int32 || [[WSYS#WAVEID|WAVEID]]*[] || Pointer array waveID's |- |} ==C-DF== Contains wave ID info {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x432D4446 ('C-DF') || Magic |- | <center>0x04</center> || int32 || wavesCount || Wave Count |- | <center>0x08</center> || int32 || [[WSYS#WAVEID|WAVEID]]*[] || Pointer array waveID's |- |} ==WAVEID== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int16 || waveGroupID || Wave Group ID (Current WSYS) |- | <center>0x02</center> || int16 || waveID || The ID assigned from this wave |- |} ==WaveGroup== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x70] || archiveName || File Path for .AW |- | <center>0x70</center> || int32|| wavesCount || Wave Count |- | <center>0x74</center> || int32 || [[WSYS#WAVE|WAVE]]*[] || Pointer array of Waves |- |} ==WAVE== Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} 77f808069c9dc2a5ce1cd08a7b80e990d17b879d 43 42 2022-03-12T04:01:56Z Xayr 1 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. Great part about WSYS is it doesn't matter what version of JAudio you're running. The WSYS format never changed between engine versions (minus the wave count int, but that doesn't matter because older versions just ignore it!) __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==C-DF== C-DF , we don't know what it stands for, but we know that it assigns ID's to each of the waves in the scenes. Note: The other sections C-ST, and C-EX point to to this category as well. They remain empty. Code for parsing them isn't even in the executables. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x432D4446 ('C-DF') || Magic |- | <center>0x04</center> || int32 || wavesCount || Wave Count |- | <center>0x08</center> || int32 || [[WSYS#WAVEID|WAVEID]]*[] || Pointer array waveID's |- |} ==WAVEID== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int16 || waveGroupID || Wave Group ID (Current WSYS) |- | <center>0x02</center> || int16 || waveID || The ID assigned from this wave |- |} ==WaveGroup== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x70] || archiveName || File Path for .AW |- | <center>0x70</center> || int32|| wavesCount || Wave Count |- | <center>0x74</center> || int32 || [[WSYS#WAVE|WAVE]]*[] || Pointer array of Waves |- |} ==WAVE== Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} fdb86a7dc3d95cc3a578670854c96cea8a6a6f74 49 43 2022-03-12T04:24:26Z 108.162.237.16 0 wikitext text/x-wiki '''WSYS''' Wave System Internally, Wave System. This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. Great part about WSYS is it doesn't matter what version of JAudio you're running. The WSYS format never changed between engine versions (minus the wave count int, but that doesn't matter because older versions just ignore it!) __TOC__ <h1>WSYS Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57535953 'WSYS' || Magic |- | <center>0x04</center> || int32 || size || WSYS Size |- | <center>0x08</center> || int32 || wsysID || WSYS ID (This is how insts select the wsys) |- | <center>0x0C</center> || int32 || waveCount || WSYS Wave Count |- | <center>0x10</center> || int32 || [[AAF#WINF | WINF Pointer]] || WBINF |- | <center>0x14</center> || int32 || [[AAF#WINF | WBCT Pointer]] || WBCT |- |} ==WINF== WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]]. The ID's for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up, WaveGroup[1] uses WaveScenes[1] {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x57494E46 'WINF' || Magic |- | <center>0x04</center> || int32 || waveGroupCount || Count of wavegroups |- | <center>0x08</center> || [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. |- |} ==SCNE== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x53434E45 'SCNE' || Magic |- | <center>0x04</center> || int64 || padding || padding |- | <center>0x0C</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF |- | <center>0x10</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX |- | <center>0x14</center> || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST |- |} ==C-DF== C-DF , we don't know what it stands for, but we know that it assigns ID's to each of the waves in the scenes. Note: The other sections C-ST, and C-EX point to to this category as well. They remain empty. Code for parsing them isn't even in the executables. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x432D4446 ('C-DF') || Magic |- | <center>0x04</center> || int32 || wavesCount || Wave Count |- | <center>0x08</center> || int32 || [[WSYS#WAVEID|WAVEID]]*[] || Pointer array waveID's |- |} ==WAVEID== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int16 || waveGroupID || Wave Group ID (Current WSYS) |- | <center>0x02</center> || int16 || waveID || The ID assigned from this wave |- |} ==WaveGroup== SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x70] || archiveName || File Path for .AW |- | <center>0x70</center> || int32|| wavesCount || Wave Count |- | <center>0x74</center> || int32 || [[WSYS#WAVE|WAVE]]*[] || Pointer array of Waves |- |} ==WAVE== Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || 0x00 || unknown |- | <center>0x01</center> || byte || format || WaveFormat |- | <center>0x02</center> || byte || baseKey || Base Key |- | <center>0x03</center> || byte || 0x00 || unknown |- | <center>0x04</center> || float || sampleRate || Sample Rate |- | <center>0x08</center> || int32 || awOfsStart || AW Offset Start |- | <center>0x0C</center> || int32 || awOfsEnd || AW Length |- | <center>0x10</center> || int32(bool) || loop || Loop flags? |- | <center>0x14</center> || int32 || loopStartSample || Loop Start Sample |- | <center>0x18</center> || int32 || loopEndSample || Loop End Sample |- | <center>0x20</center> || int32 || sampleCount || Samples Count |- | <center>0x24</center> || short || pLast || ADPCM Loop Last Sample |- | <center>0x26</center> || short || pPenult || ADPCM Loop Penult Sample |- |} 05e196b7da621c960569e94ed6a0ca5fa67f201f AW 0 10 39 2022-03-12T03:44:32Z Xayr 1 Created page with "The .AW file is a raw cluster of mostly unpadded ADPCM4 data. This file is completely useless by itself, to parse it, you need a [[WSYS]]" wikitext text/x-wiki The .AW file is a raw cluster of mostly unpadded ADPCM4 data. This file is completely useless by itself, to parse it, you need a [[WSYS]] 1ca45f3ca8ce001c8ed81c45c56502b58943acf5 IBNK 0 11 45 2022-03-12T04:04:59Z Xayr 1 Created page with " IBNK Stands for "Instrument Bank". It holds the parameters required to play one of the sounds out of the WSYS as a melodic instrument. They can also contain sound effects. All pointers are relative to the 0th byte of the IBNK ==Header== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x49424e4b 'IBNK' || Magic |- | <center>0x04</center> || int32 || Size || Size of the IBNK |- | <center>0x08</cent..." wikitext text/x-wiki IBNK Stands for "Instrument Bank". It holds the parameters required to play one of the sounds out of the WSYS as a melodic instrument. They can also contain sound effects. All pointers are relative to the 0th byte of the IBNK ==Header== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x49424e4b 'IBNK' || Magic |- | <center>0x04</center> || int32 || Size || Size of the IBNK |- | <center>0x08</center> || int32 || ID || Global IBNK ID |- | <center>0x0C</center> || int32 || Flags || Flags |- | <center>0x10</center> || byte[0x14] || Padding || Padding |- | <center>0x24</center> || int32 || 0x42414E4B 'BANK' || Magic |- | <center>0x28</center> || int32*[0xF0] || Instrument Pointers || Pointers to instrument objects (0 = empty slot) |- |} ==INST== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x494E5354 'INST' || Magic |- | <center>0x04</center> || int32 || 0 || Zero (Padding) |- | <center>0x08</center> || float || frequencyMultiplier || Frequency Multiplier |- | <center>0x0C</center> || float || gainMultiplier || gainMultiplier |- | <center>0x10</center> || int32* || Osc1* || Pointer to first [[AAF#JOscillator|JOscillator]] (0 = null) |- | <center>0x14</center> || int32* || Osc2* || Pointer to second [[AAF#JOscillator|JOscillator]](0 = null) |- | <center>0x18</center> || int32* || Eff1* || Pointer to first Effect (0 = null) |- | <center>0x1C</center> || int32* || Eff2* || Pointer to second Effect (0 = null) |- | <center>0x20</center> || int32* || Sen1* || Pointer to first sensor (0 = null) |- | <center>0x24</center> || int32* || Sen2* || Pointer to second swnsor (0 = null) |- | <center>0x28</center> || int32 || keyRegionCount || Count of key regions |- | <center>0x2C</center> || [[AAF#InstrumentKeyRegion|InstrumentKeyRegion]]*[keyRegionCount] || Key Regions || int32 pointers to key regions |- |} ===InstrumentKeyRegion=== Container for an instruments keys. Usually there's only one. The "root key" item defines the key this specific key object is assigned to. By default, it starts at 0. The next definition fills all the keys in betwen, meaning if the next root key was 127, the keys at 0-127 would be assigned to that region. A single key has two parts to it. The note, and the velocity. The note is specified by the key region, and the velocity regions are defined by attaching them to key regions. Velocity regions, being the final part of the sound, handle the finetuning, and wave selection. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || bKey || base Key |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || int32 || velocityRegionCount || Count of velocity regions |- | <center>0x08</center> || [[AAF#InstrumentVeloRegion|InstrumentVeloRegion]]*[velocityRegionCount] || velregptr || Int32 pointers to each velocity region. |- |} ====InstrumentVeloRegion==== The velocity region of a KeyRegion. The "root velocity" operates identically to the Key Region. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || bKey || root velocity |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || short || wsysID || WSYS that the sound for this instrument is in. |- | <center>0x06</center> || short || waveID || WaveID in the WSYS that the sound for this instrument is in. |- | <center>0x08</center> || float || gainMultFT || Finetune float for gain / volume |- | <center>0x0C</center> || float || freqMultFT || Finetune float for pitch / frequency |- |} ==PER2== A type of INST that doesn't have a pitch or gain on the main instrument, or as many features (like oscillators) {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || 0x50455232 'PER2' || Magic |- | <center>0x04</center> || byte[0x84] || 0 || Unused |- | <center>0x8C</center> || [[AAF#PercussionKey|PercussionKey]]*[100] || 100 percussion entries || Int32 pointers to percussion keys |- |} ===PercussionKey=== Key type for PER2's instrument data (Not regioned) {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || float || pitch || Finetune Pitch |- | <center>0x04</center> || float || volume || Finetune Gain |- | <center>0x08</center> || byte[8] || unused || unused |- | <center>0x10</center> || int32 || velocityRegionCount || Count of velocity regions |- | <center>0x14</center> || [[AAF#InstrumentVeloRegion|InstrumentVeloRegion]]*[velocityRegionCount] || velregptr || Int32 Pointers to each velocity region. |- |} ==JOscillator== JAITOscillator is an internal name. It stands for JAudioInterface:TOscillator. They have no header data, and no other identifying data. , they are pointed to directly by INST objects. The width and vertex operators are used mainly for effects like vibrato. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || [[AAF#JOscillatorMode|JOscillatorMode]] || Mode / Target |- | <center>0x01</center> || byte[3] || padding || padding |- | <center>0x04</center> || float || rate || rate |- | <center>0x08</center> || int32* || attackEnvOffset || Int32 pointer to attack [[AAF#JEnvelope|JEnvelope]] |- | <center>0x0C</center> || int32* || releaseEnvOffset || Int32 pointer to release [[AAF#JEnvelope|JEnvelope]] |- | <center>0x10</center> || float || width || Width of the oscillator |- | <center>0x14</center> || float || vertex || Vertex of the oscillator |- |} ===JOscillatorMode=== Different modes that the JOscillator can target. {| class="wikitable" |- ! mode !! Name !! Desc |- | <center>0x01</center> || Volume || Changes volume of instrument |- | <center>0x02</center> || Pitch || Changes pitch of instrument |- | <center>0x03</center> || Pan || Changes pan of instrument |- | <center>0x04</center> || FX || Changes filter |- | <center>0x05</center> || Dolby || (Unused) for digital sound output / dolby surround |- |} ===JEnvelope=== JEnvelopes are only referenced by a [[AAF#JOscillator|JOscillator]]. Similar to their parent, they have no identifying header data. In addition, they have no static length. They are ended by an end marker (Which in practice, will require a double scan) A JEnvelope is composed of vectors with modes with a structure as follows: {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || short || [[AAF#JEnvelopeMode|JEnvelopeMode]] || Mode selection for this vector |- | <center>0x02</center> || short || time || Time that this takes place (In ticks) |- | <center>0x06</center> || short || value || Value of this vector at this time |- | <center>0x10</center> || int32 || velocityRegionCount || Count of velocity regions |- |} ====JEnvelopeMode==== {| class="wikitable" |- ! mode !! Name !! Desc |- | <center>0x00</center> || Linear || Linear approach to the next vector value |- | <center>0x01</center> || Square || Square curve approach to the next vector value |- | <center>0x02</center> || Square || Square Root (n^0.5) curve approach to the next vector value |- | <center>0x03</center> || SampleCell || Unknown, (Unused?) |- | <center>0x0D</center> || Loop || Command vector, defines a loop point |- | <center>0x0E</center> || Hold || Pauses the envelope, usually used after it completes |- | <center>0x0F</center> || Stop || Stops both the instrument and the envelope |- |} 29dcd53cce8a148c23184c013a414b3dcd250f1b ASN 0 12 47 2022-03-12T04:16:30Z 108.162.237.4 0 Created page with " __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|WaveGroup]][0x12] || Categories || Category array with hardcoded arbitrary length |- |}" wikitext text/x-wiki __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|WaveGroup]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} cb85a2f9f036b281846f0ca2978b8c5847e81b56 48 47 2022-03-12T04:21:03Z 108.162.237.140 0 wikitext text/x-wiki __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1c</center> || short || categoryID || Count of sounds |- | <center>0x20</center> || short || Category Index || Category Index |- |} 68e2bece6b00fec29c231cfce8542d478e3d1a88 SFT 0 13 50 2022-03-12T21:09:58Z Xayr 1 Created page with " __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actu..." wikitext text/x-wiki __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actually is. The only way you can certify that you have the right amount of entries is by either reading EOF of math <code>(FILE_SIZE - 0x10) / 0x30</code> The above has worked for me historically. <h2>StreamEntry</h2> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || byte[0x16] || name || Stream Name |- | <center>+0x16</center> || int32 || fileSize || Size |- | <center>+0x1C</center> || int16 || sampleRate || Sample Rate |- | <center>+0x1E</center> || int16 || format || Stream Format |- | <center>+0x20</center> || int16 || padding || padding |- | <center>+0x22</center> || int16 || frameRate ||| Frame Rate |- | <center>+0x24</center> || int32 || loop || If > 0, loop enabled |- | <center>+0x2C</center> || int32 || loopSampleStart || Once the stream ends, if looped, go back to this sample |- | <center>+0x30</center> || int64 || padding? || Might be unused, or might contain the leadin samples for the loop... |- |} 61967a56ba8ab1b793543647af467ba23428d95a 51 50 2022-03-12T21:11:01Z Xayr 1 wikitext text/x-wiki __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actually is. The only way you can certify that you have the right amount of entries is by either reading EOF of math <code>(FILE_SIZE - 0x10) / 0x30</code> The above has worked for me historically. <h2>StreamEntry</h2> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || byte[0x16] || name || Stream Name |- | <center>+0x16</center> || int32 || fileSize || Size |- | <center>+0x1C</center> || int16 || sampleRate || Sample Rate |- | <center>+0x1E</center> || int16 || format || Stream Format |- | <center>+0x20</center> || int16 || padding || padding |- | <center>+0x22</center> || int16 || frameRate ||| Frame Rate |- | <center>+0x24</center> || int32 || loop || If > 0, loop enabled |- | <center>+0x28</center> || int32 || loopSampleStart || Once the stream ends, if looped, go back to this sample |- | <center>+0x2C</center> || int64 || padding? || Might be unused, or might contain the leadin samples for the loop... |- |} ce318d196a41171f24662bd8dcf30b84078f7f97 52 51 2022-03-12T21:14:07Z Xayr 1 wikitext text/x-wiki __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actually is. The only way you can certify that you have the right amount of entries is by either reading EOF of math <code>(FILE_SIZE - 0x10) / 0x30</code> The above has worked for me historically. <h2>StreamEntry</h2> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || byte[0x16] || name || Stream Name |- | <center>+0x16</center> || int32 || sampleCount || Sample Count |- | <center>+0x1C</center> || int16 || sampleRate || Sample Rate |- | <center>+0x1E</center> || int16 || format || Stream Format |- | <center>+0x20</center> || int16 || padding || padding |- | <center>+0x22</center> || int16 || frameRate ||| Frame Rate |- | <center>+0x24</center> || int32 || loop || If > 0, loop enabled |- | <center>+0x28</center> || int32 || loopSampleStart || Once the stream ends, if looped, go back to this sample |- | <center>+0x2C</center> || int64 || padding? || Might be unused, or might contain the leadin samples for the loop... |- |} 2523d235d7dfaf080fd02ffbb4ad05f9245ddbdf 53 52 2022-03-12T21:22:52Z Xayr 1 wikitext text/x-wiki __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actually is. The only way you can certify that you have the right amount of entries is by either reading EOF of math <code>(FILE_SIZE - 0x10) / 0x30</code> The above has worked for me historically. <h2>StreamEntry</h2> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || byte[0x10] || name || Stream Name |- | <center>+0x10</center> || int32 || size || File Size |- | <center>+0x14</center> || int32 || sampleCount || Sample Count |- | <center>+0x18</center> || int16 || sampleRate || Sample Rate |- | <center>+0x1A</center> || int16 || format || Stream Format |- | <center>+0x1C</center> || int16 || padding || padding |- | <center>+0x1E</center> || int16 || frameRate ||| Frame Rate |- | <center>+0x20</center> || int32 || loop || If > 0, loop enabled |- | <center>+0x24</center> || int32 || loopSampleStart || Once the stream ends, if looped, go back to this sample |- | <center>+0x28</center> || int64 || padding? || Might be unused, or might contain the leadin samples for the loop... |- |} 0965fd510d2468a3a8bf7c845ba6e128a6ec587a SFT 0 13 54 53 2022-03-12T21:23:22Z Xayr 1 wikitext text/x-wiki __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actually is. The only way you can certify that you have the right amount of entries is by either reading EOF of math <code>(FILE_SIZE - 0x10) / 0x30</code> The above has worked for me historically. <h2>StreamEntry</h2> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || byte[0x10] || name || Stream Name or Path to AFC file |- | <center>+0x10</center> || int32 || size || File Size |- | <center>+0x14</center> || int32 || sampleCount || Sample Count |- | <center>+0x18</center> || int16 || sampleRate || Sample Rate |- | <center>+0x1A</center> || int16 || format || Stream Format |- | <center>+0x1C</center> || int16 || padding || padding |- | <center>+0x1E</center> || int16 || frameRate ||| Frame Rate |- | <center>+0x20</center> || int32 || loop || If > 0, loop enabled |- | <center>+0x24</center> || int32 || loopSampleStart || Once the stream ends, if looped, go back to this sample |- | <center>+0x28</center> || int64 || padding? || Might be unused, or might contain the leadin samples for the loop... |- |} 702b76fe301e1c9543160c3b1ed4a6aea2e5f237 62 54 2022-03-12T21:51:42Z Xayr 1 wikitext text/x-wiki Stream File Table __TOC__ <h1>SFT Structure</h1> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int32 || count || Entry Count |- | <center>0x04</center> || byte[0xC] || padding || padding |- | <center>0x10</center> || [[SFT#StreamEntry | StreamEntry]][]||| Entries |- |} <b> Important note about the SIZE in vanilla games!! </b> The size is not accurate, in games like windwaker it will report a smaller count than there actually is. The only way you can certify that you have the right amount of entries is by either reading EOF of math <code>(FILE_SIZE - 0x10) / 0x30</code> The above has worked for me historically. <h2>StreamEntry</h2> {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || byte[0x10] || name || Stream Name or Path to AFC file |- | <center>+0x10</center> || int32 || size || File Size |- | <center>+0x14</center> || int32 || sampleCount || Sample Count |- | <center>+0x18</center> || int16 || sampleRate || Sample Rate |- | <center>+0x1A</center> || int16 || format || Stream Format |- | <center>+0x1C</center> || int16 || padding || padding |- | <center>+0x1E</center> || int16 || frameRate ||| Frame Rate |- | <center>+0x20</center> || int32 || loop || If > 0, loop enabled |- | <center>+0x24</center> || int32 || loopSampleStart || Once the stream ends, if looped, go back to this sample |- | <center>+0x28</center> || int64 || padding? || Might be unused, or might contain the leadin samples for the loop... |- |} 19d82862d4db2d593cfbff6f19263eebb5ebebd6 BARC 0 14 55 2022-03-12T21:25:53Z Xayr 1 Created page with "The BARC file is usually the ARC file found in older JSystem games that use JAudio. It most commonly sits in the "Seqs" folder in AudioRes It's useless by itself, but it usually contains useful data. You need the [[HED]] to parse it." wikitext text/x-wiki The BARC file is usually the ARC file found in older JSystem games that use JAudio. It most commonly sits in the "Seqs" folder in AudioRes It's useless by itself, but it usually contains useful data. You need the [[HED]] to parse it. 78c1c32639ee651d1346150a54e994c8d52b8a39 60 55 2022-03-12T21:50:57Z Xayr 1 wikitext text/x-wiki <b>Binary Archive</b> The BARC file is usually the ARC file found in older JSystem games that use JAudio. It most commonly sits in the "Seqs" folder in AudioRes It's useless by itself, but it usually contains useful data. You need the [[HED]] to parse it. 1871c6bf2fcb17f4b8cfaa3ee0f4bf53cd7fa526 BMS 0 15 56 2022-03-12T21:46:46Z Xayr 1 Created page with "I don't have problems, you have problems. __TOC__" wikitext text/x-wiki I don't have problems, you have problems. __TOC__ 5a54ece6e289bf2a97471024062e11564153eaf9 61 56 2022-03-12T21:51:18Z Xayr 1 wikitext text/x-wiki <b>Binary Musical Sequence</b> I don't have problems, you have problems. __TOC__ d3a6f304c8028955d68c47b8dc39c472df2011a1 63 61 2022-03-12T22:06:04Z Xayr 1 wikitext text/x-wiki <b>Binary Musical Sequence</b> I don't have problems, you have problems. __TOC__ ==The Instruction Set== {| class="wikitable" ! Instruction || Mnemonic || Type || Additional Arguments |- | 0x00 - 0x80 || NOTE_ON || NoteOn || |- | 0x80 || CMD_WAIT8 || Wait || int8 LEN, |- | 0x81 || NOTE_OFF || NoteOff || None |- | 0x88 || CMD_WAIT16 || Wait || int16 LEN |- | 0x90 || SETPARAM_90 || Param || |- | 0x91 || SETPARAM_91 || Param || |- | 0x92 || SETPARAM_92 || Param || |- | 0x94 || PERF_U8_NODUR || Perf || |- | 0x96 || PERF_U8_DUR_U8 || Perf || |- | 0x97 || PERF_U8_DUR_U16 || Perf || |- | 0x98 || PERF_S8_NODUR || Perf || |- | 0x9A || PERF_S8_DUR_U8 || Perf || |- | 0x9B || PERF_S8_DUR_U16 || Perf || |- | 0x9C || PERF_S16_NODUR || Perf || |- | 0x9D || PERF_S16_DUR_U8 || Perf || |- | 0x9E || PERF_S16_DUR_U8_9E || Perf || |- | 0x9F || PERF_S16_DUR_U16 || Perf || |- | 0xA0 || PARAM_SET_R || Param || |- | 0xA1 || PARAM_ADD_R || Param || |- | 0xA2 || PARAM_MUL_R || Param || |- | 0xA3 || PARAM_CMP_R || Param || |- | 0xA4 || PARAM_SET_8 || Param || |- | 0xA5 || PARAM_ADD_8 || Param || |- | 0xA6 || PARAM_MUL_8 || Param || |- | 0xA7 || PARAM_CMP_8 || Param || |- | 0xA8 || PARAM_LOAD_UNK || ? || |- | 0xA9 || PARAM_BITWISE || Param || |- | 0xAA || PARAM_LOADTBL || Param || |- | 0xAB || PARAM_SUBTRACT || Param || |- | 0xAC || PARAM_SET_16 || Param || |- | 0xAD || PARAM_ADD_16 || Param || |- | 0xAE || PARAM_MUL_16 || Param || |- | 0xAF || PARAM_CMP_16 || Param || |- | 0xB0 || OPOVERRIDE_1 || Override || |- | 0xB1 || OPOVERRIDE_2 || Override || |- | 0xB4 || OPOVERRIDE_4 || Override || |- | 0xB8 || OPOVERRIDE_R || Override || |- | 0xC1 || OPENTRACK || Track || |- | 0xC2 || OPENTRACKBROS || Track || |- | 0xC4 || CALL || Flow || |- | 0xC5 || RETURN_NOARG || Flow || |- | 0xC6 || RETURN || Flow || |- | 0xC8 || JMP || Flow || |- | 0xC9 || LOOP_S || Flow || |- | 0xCA || LOOP_E || Flow || |- | 0xCB || READPORT || Port || |- | 0xCC || WRITEPORT || Port || |- | 0xCD || CHECKPORTIMPORT || Port || |- | 0xCE || CHECKPORTEXPORT || Port || |- | 0xCF || CMD_WAITR || Wait || |- | 0xD1 || PARENTWRITEPORT || Port || |- | 0xD2 || CHILDWRITEPORT || Port || |- | 0xD4 || SETLASTNOTE || || |- | 0xD5 || TIMERELATE || || |- | 0xD6 || SIMPLEOSC || Oscillator || |- | 0xD7 || SIMPLEENV || Envelope || |- | 0xD8 || SIMPLEADSR || || |- | 0xD9 || TRANSPOSE || || |- | 0xDA || CLOSETRACK || Track || |- | 0xDB || OUTSWITCH || || |- | 0xDC || UPDATESYNC || || |- | 0xDD || BUSCONNECT || Port || |- | 0xDE || PAUSESTATUS || Flow || |- | 0xDF || SETINTERRUPT || Interrupt || |- | 0xE0 || DISINTERRUPT || Interrupt || |- | 0xE1 || CLRI || Interrupt || |- | 0xE2 || SETI || Interrupt || |- | 0xE3 || RETI || Interrupt || |- | 0xE4 || INTTIMER || Interrupt || |- | 0xE5 || VIBDEPTH || || |- | 0xE6 || VIBDEPTHMIDI || || |- | 0xE7 || SYNCCPU || Flow || |- | 0xE8 || FLUSHALL || || |- | 0xE9 || FLUSHRELEASE || || |- | 0xEA || WAIT_VLQ || Wait || |- | 0xEB || PANPOWSET || || |- | 0xEC || IIRSET || || |- | 0xED || FIRSET || || |- | 0xEE || EXTSET || || |- | 0xEF || PANSWSET || || |- | 0xF0 || OSCROUTE || || |- | 0xF1 || IIRCUTOFF || || |- | 0xF2 || OSCFULL || || |- | 0xF3 || VOLUMEMODE || || |- | 0xF4 || VIBPITCH || || |- | 0xFA || CHECKWAVE || || |- | 0xFB || PRINTF || PrintF || Variable |- | 0xFC || NOP || Misc || Skips this opcode, can be used for patching things out |- | 0xFD || TEMPO || Flow || int16 Tempo |- | 0xFE || TIMEBASE || Flow || int16 Timebase |- | 0xFF || FINISH || Track || |} 9c558c21d06975a1a0b4653116074b6519e80afa 64 63 2022-03-12T22:15:35Z Xayr 1 /* The Instruction Set */ wikitext text/x-wiki <b>Binary Musical Sequence</b> I don't have problems, you have problems. __TOC__ ==The Instruction Set== {| class="wikitable" ! Instruction || Mnemonic || Type || Additional Arguments |- | 0x00 - 0x80 || NOTE_ON || NoteOn || Variable |- | 0x80 || CMD_WAIT8 || Wait || int8 LEN, |- | 0x81 || NOTE_OFF || NoteOff || None |- | 0x88 || CMD_WAIT16 || Wait || int16 LEN |- | 0x90 || SETPARAM_90 || Param || byte Destination Register, byte Value |- | 0x91 || SETPARAM_91 || Param || byte Destination Register, byte Value |- | 0x92 || SETPARAM_92 || Param || byte Destination Register, byte Value |- | 0x94 || PERF_U8_NODUR || Perf || byte PERFValue, byte value |- | 0x96 || PERF_U8_DUR_U8 || Perf || byte PERFValue, byte value, byte duration |- | 0x97 || PERF_U8_DUR_U16 || Perf || byte PERFValue, byte value, short duration |- | 0x98 || PERF_S8_NODUR || Perf || byte PERFValue, sbyte value |- | 0x9A || PERF_S8_DUR_U8 || Perf || byte PERFValue, sbyte value, byte duration |- | 0x9B || PERF_S8_DUR_U16 || Perf || byte PERFValue, sbyte value, short duration |- | 0x9C || PERF_S16_NODUR || Perf || byte PERFValue, short value |- | 0x9D || PERF_S16_DUR_U8 || Perf || byte PERFValue, short value, byte duration |- | 0x9E || PERF_S16_DUR_U8_9E || Perf || byte PERFValue, short value, byte duration |- | 0x9F || PERF_S16_DUR_U16 || Perf || byte PERFValue, short value, short duration |- | 0xA0 || PARAM_SET_R || Param || byte dest_register, byte src_register |- | 0xA1 || PARAM_ADD_R || Param || byte dest_register, byte src_register |- | 0xA2 || PARAM_MUL_R || Param || byte dest_register, byte src_register |- | 0xA3 || PARAM_CMP_R || Param || byte dest_register, byte src_register |- | 0xA4 || PARAM_SET_8 || Param || byte register, byte value |- | 0xA5 || PARAM_ADD_8 || Param || byte register, byte value |- | 0xA6 || PARAM_MUL_8 || Param || byte register, byte value |- | 0xA7 || PARAM_CMP_8 || Param || byte register, byte value |- | 0xA8 || PARAM_LOAD_UNK || ? || ? |- | 0xA9 || PARAM_BITWISE || Param || |- | 0xAA || PARAM_LOADTBL || Param || |- | 0xAB || PARAM_SUBTRACT || Param || |- | 0xAC || PARAM_SET_16 || Param || byte register, short value |- | 0xAD || PARAM_ADD_16 || Param || byte register, short value |- | 0xAE || PARAM_MUL_16 || Param || byte register, short value |- | 0xAF || PARAM_CMP_16 || Param || byte register, short value |- | 0xB0 || OPOVERRIDE_1 || Override || It's complicated. |- | 0xB1 || OPOVERRIDE_2 || Override || |- | 0xB4 || OPOVERRIDE_4 || Override || |- | 0xB8 || OPOVERRIDE_R || Override || |- | 0xC1 || OPENTRACK || Track || byte trackID &lt;= 0xF, int24 trackID |- | 0xC2 || OPENTRACKBROS || Track || |- | 0xC4 || CALL || Flow || byte condition, int24 address |- | 0xC5 || RETURN_NOARG || Flow || |- | 0xC6 || RETURN || Flow || byte condition |- | 0xC8 || JMP || Flow || int24 address |- | 0xC9 || LOOP_S || Flow || byte count |- | 0xCA || LOOP_E || Flow || |- | 0xCB || READPORT || Port || byte srcPort, byte dstRegister |- | 0xCC || WRITEPORT || Port || byte srcPort, byte dstRegister |- | 0xCD || CHECKPORTIMPORT || Port || byte srcPort |- | 0xCE || CHECKPORTEXPORT || Port || byte srcPort |- | 0xCF || CMD_WAITR || Wait || byte register |- | 0xD1 || PARENTWRITEPORT || Port || |- | 0xD2 || CHILDWRITEPORT || Port || |- | 0xD4 || SETLASTNOTE || || byte lastNoteValue |- | 0xD5 || TIMERELATE || || |- | 0xD6 || SIMPLEOSC || Oscillator || |- | 0xD7 || SIMPLEENV || Envelope || |- | 0xD8 || SIMPLEADSR || || |- | 0xD9 || TRANSPOSE || || |- | 0xDA || CLOSETRACK || Track || byte trackID |- | 0xDB || OUTSWITCH || || |- | 0xDC || UPDATESYNC || || |- | 0xDD || BUSCONNECT || Port || |- | 0xDE || PAUSESTATUS || Flow || |- | 0xDF || SETINTERRUPT || Interrupt || byte InterruptID, int24 Callback_Address |- | 0xE0 || DISINTERRUPT || Interrupt || |- | 0xE1 || CLRI || Interrupt || |- | 0xE2 || SETI || Interrupt || |- | 0xE3 || RETI || Interrupt || |- | 0xE4 || INTTIMER || Interrupt || |- | 0xE5 || VIBDEPTH || || |- | 0xE6 || VIBDEPTHMIDI || || |- | 0xE7 || SYNCCPU || Flow || short syncdata? |- | 0xE8 || FLUSHALL || || |- | 0xE9 || FLUSHRELEASE || || |- | 0xEA || WAIT_VLQ || Wait || VLC delay |- | 0xEB || PANPOWSET || || |- | 0xEC || IIRSET || || |- | 0xED || FIRSET || || |- | 0xEE || EXTSET || || |- | 0xEF || PANSWSET || || |- | 0xF0 || OSCROUTE || || |- | 0xF1 || IIRCUTOFF || || |- | 0xF2 || OSCFULL || || |- | 0xF3 || VOLUMEMODE || || |- | 0xF4 || VIBPITCH || || |- | 0xFA || CHECKWAVE || || |- | 0xFB || PRINTF || PrintF || Variable |- | 0xFC || NOP || Misc || Skips this opcode, can be used for patching things out |- | 0xFD || TEMPO || Flow || int16 Tempo |- | 0xFE || TIMEBASE || Flow || int16 Timebase |- | 0xFF || FINISH || Track || |} 122ed2a971f83037999b8e05d1062824b6e99fe1 65 64 2022-03-12T22:20:15Z Xayr 1 wikitext text/x-wiki <b>Binary Musical Sequence</b> I don't have problems, you have problems. __TOC__ ==Tracks== Tracks are an independent "thread" that will execute BMS instructions alongside other tracks. A track can have up to 16 children, all of which must be other tracks. Each track has * 24 Registers * 7 voices * Its own stack / address history * Its own instrument / bank selection * Its own independent wait timer etc. A BMS file is opened by the "root track" which is the start of the file opening up a bunch of child tracks. The root track usually sits and controls stuff like the tempo, while the child tracks will do the actual playing of music. BMS will execute instructions on a track endlessly and all at once until the track has either been terminated, paused, or ESPECIALLY <b>if the wait timer is > 0</b> ==The Instruction Set== {| class="wikitable" ! Instruction || Mnemonic || Type || Additional Arguments |- | 0x00 - 0x80 || NOTE_ON || NoteOn || Variable |- | 0x80 || CMD_WAIT8 || Wait || int8 LEN, |- | 0x81 || NOTE_OFF || NoteOff || None |- | 0x88 || CMD_WAIT16 || Wait || int16 LEN |- | 0x90 || SETPARAM_90 || Param || byte Destination Register, byte Value |- | 0x91 || SETPARAM_91 || Param || byte Destination Register, byte Value |- | 0x92 || SETPARAM_92 || Param || byte Destination Register, byte Value |- | 0x94 || PERF_U8_NODUR || Perf || byte PERFValue, byte value |- | 0x96 || PERF_U8_DUR_U8 || Perf || byte PERFValue, byte value, byte duration |- | 0x97 || PERF_U8_DUR_U16 || Perf || byte PERFValue, byte value, short duration |- | 0x98 || PERF_S8_NODUR || Perf || byte PERFValue, sbyte value |- | 0x9A || PERF_S8_DUR_U8 || Perf || byte PERFValue, sbyte value, byte duration |- | 0x9B || PERF_S8_DUR_U16 || Perf || byte PERFValue, sbyte value, short duration |- | 0x9C || PERF_S16_NODUR || Perf || byte PERFValue, short value |- | 0x9D || PERF_S16_DUR_U8 || Perf || byte PERFValue, short value, byte duration |- | 0x9E || PERF_S16_DUR_U8_9E || Perf || byte PERFValue, short value, byte duration |- | 0x9F || PERF_S16_DUR_U16 || Perf || byte PERFValue, short value, short duration |- | 0xA0 || PARAM_SET_R || Param || byte dest_register, byte src_register |- | 0xA1 || PARAM_ADD_R || Param || byte dest_register, byte src_register |- | 0xA2 || PARAM_MUL_R || Param || byte dest_register, byte src_register |- | 0xA3 || PARAM_CMP_R || Param || byte dest_register, byte src_register |- | 0xA4 || PARAM_SET_8 || Param || byte register, byte value |- | 0xA5 || PARAM_ADD_8 || Param || byte register, byte value |- | 0xA6 || PARAM_MUL_8 || Param || byte register, byte value |- | 0xA7 || PARAM_CMP_8 || Param || byte register, byte value |- | 0xA8 || PARAM_LOAD_UNK || ? || ? |- | 0xA9 || PARAM_BITWISE || Param || |- | 0xAA || PARAM_LOADTBL || Param || |- | 0xAB || PARAM_SUBTRACT || Param || |- | 0xAC || PARAM_SET_16 || Param || byte register, short value |- | 0xAD || PARAM_ADD_16 || Param || byte register, short value |- | 0xAE || PARAM_MUL_16 || Param || byte register, short value |- | 0xAF || PARAM_CMP_16 || Param || byte register, short value |- | 0xB0 || OPOVERRIDE_1 || Override || It's complicated. |- | 0xB1 || OPOVERRIDE_2 || Override || |- | 0xB4 || OPOVERRIDE_4 || Override || |- | 0xB8 || OPOVERRIDE_R || Override || |- | 0xC1 || OPENTRACK || Track || byte trackID &lt;= 0xF, int24 trackID |- | 0xC2 || OPENTRACKBROS || Track || |- | 0xC4 || CALL || Flow || byte condition, int24 address |- | 0xC5 || RETURN_NOARG || Flow || |- | 0xC6 || RETURN || Flow || byte condition |- | 0xC8 || JMP || Flow || int24 address |- | 0xC9 || LOOP_S || Flow || byte count |- | 0xCA || LOOP_E || Flow || |- | 0xCB || READPORT || Port || byte srcPort, byte dstRegister |- | 0xCC || WRITEPORT || Port || byte srcPort, byte dstRegister |- | 0xCD || CHECKPORTIMPORT || Port || byte srcPort |- | 0xCE || CHECKPORTEXPORT || Port || byte srcPort |- | 0xCF || CMD_WAITR || Wait || byte register |- | 0xD1 || PARENTWRITEPORT || Port || |- | 0xD2 || CHILDWRITEPORT || Port || |- | 0xD4 || SETLASTNOTE || || byte lastNoteValue |- | 0xD5 || TIMERELATE || || |- | 0xD6 || SIMPLEOSC || Oscillator || |- | 0xD7 || SIMPLEENV || Envelope || |- | 0xD8 || SIMPLEADSR || || |- | 0xD9 || TRANSPOSE || || |- | 0xDA || CLOSETRACK || Track || byte trackID |- | 0xDB || OUTSWITCH || || |- | 0xDC || UPDATESYNC || || |- | 0xDD || BUSCONNECT || Port || |- | 0xDE || PAUSESTATUS || Flow || |- | 0xDF || SETINTERRUPT || Interrupt || byte InterruptID, int24 Callback_Address |- | 0xE0 || DISINTERRUPT || Interrupt || |- | 0xE1 || CLRI || Interrupt || |- | 0xE2 || SETI || Interrupt || |- | 0xE3 || RETI || Interrupt || |- | 0xE4 || INTTIMER || Interrupt || |- | 0xE5 || VIBDEPTH || || |- | 0xE6 || VIBDEPTHMIDI || || |- | 0xE7 || SYNCCPU || Flow || short syncdata? |- | 0xE8 || FLUSHALL || || |- | 0xE9 || FLUSHRELEASE || || |- | 0xEA || WAIT_VLQ || Wait || VLC delay |- | 0xEB || PANPOWSET || || |- | 0xEC || IIRSET || || |- | 0xED || FIRSET || || |- | 0xEE || EXTSET || || |- | 0xEF || PANSWSET || || |- | 0xF0 || OSCROUTE || || |- | 0xF1 || IIRCUTOFF || || |- | 0xF2 || OSCFULL || || |- | 0xF3 || VOLUMEMODE || || |- | 0xF4 || VIBPITCH || || |- | 0xFA || CHECKWAVE || || |- | 0xFB || PRINTF || PrintF || Variable |- | 0xFC || NOP || Misc || Skips this opcode, can be used for patching things out |- | 0xFD || TEMPO || Flow || int16 Tempo |- | 0xFE || TIMEBASE || Flow || int16 Timebase |- | 0xFF || FINISH || Track || |} 710a8a04277b71ff940c819dfd7a6e537bccd8e3 67 65 2022-03-12T22:28:50Z Xayr 1 wikitext text/x-wiki <b>Binary Musical Sequence</b> I don't have problems, you have problems. __TOC__ ==Tracks== Tracks are an independent "thread" that will execute BMS instructions alongside other tracks. A track can have up to 16 children, all of which must be other tracks. Each track has * 24 Registers * 7 voices * Its own stack / address history * Its own instrument / bank selection * Its own independent wait timer etc. A BMS file is opened by the "root track" which is the start of the file opening up a bunch of child tracks. [[Image:BMS_OpenTrack.png]] The root track usually sits and controls stuff like the tempo, while the child tracks will do the actual playing of music. BMS will execute instructions on a track endlessly and all at once until the track has either been terminated, paused, or ESPECIALLY <b>if the wait timer is > 0</b> ==The Instruction Set== {| class="wikitable" ! Instruction || Mnemonic || Type || Additional Arguments |- | 0x00 - 0x80 || NOTE_ON || NoteOn || Variable |- | 0x80 || CMD_WAIT8 || Wait || int8 LEN, |- | 0x81 || NOTE_OFF || NoteOff || None |- | 0x88 || CMD_WAIT16 || Wait || int16 LEN |- | 0x90 || SETPARAM_90 || Param || byte Destination Register, byte Value |- | 0x91 || SETPARAM_91 || Param || byte Destination Register, byte Value |- | 0x92 || SETPARAM_92 || Param || byte Destination Register, byte Value |- | 0x94 || PERF_U8_NODUR || Perf || byte PERFValue, byte value |- | 0x96 || PERF_U8_DUR_U8 || Perf || byte PERFValue, byte value, byte duration |- | 0x97 || PERF_U8_DUR_U16 || Perf || byte PERFValue, byte value, short duration |- | 0x98 || PERF_S8_NODUR || Perf || byte PERFValue, sbyte value |- | 0x9A || PERF_S8_DUR_U8 || Perf || byte PERFValue, sbyte value, byte duration |- | 0x9B || PERF_S8_DUR_U16 || Perf || byte PERFValue, sbyte value, short duration |- | 0x9C || PERF_S16_NODUR || Perf || byte PERFValue, short value |- | 0x9D || PERF_S16_DUR_U8 || Perf || byte PERFValue, short value, byte duration |- | 0x9E || PERF_S16_DUR_U8_9E || Perf || byte PERFValue, short value, byte duration |- | 0x9F || PERF_S16_DUR_U16 || Perf || byte PERFValue, short value, short duration |- | 0xA0 || PARAM_SET_R || Param || byte dest_register, byte src_register |- | 0xA1 || PARAM_ADD_R || Param || byte dest_register, byte src_register |- | 0xA2 || PARAM_MUL_R || Param || byte dest_register, byte src_register |- | 0xA3 || PARAM_CMP_R || Param || byte dest_register, byte src_register |- | 0xA4 || PARAM_SET_8 || Param || byte register, byte value |- | 0xA5 || PARAM_ADD_8 || Param || byte register, byte value |- | 0xA6 || PARAM_MUL_8 || Param || byte register, byte value |- | 0xA7 || PARAM_CMP_8 || Param || byte register, byte value |- | 0xA8 || PARAM_LOAD_UNK || ? || ? |- | 0xA9 || PARAM_BITWISE || Param || |- | 0xAA || PARAM_LOADTBL || Param || |- | 0xAB || PARAM_SUBTRACT || Param || |- | 0xAC || PARAM_SET_16 || Param || byte register, short value |- | 0xAD || PARAM_ADD_16 || Param || byte register, short value |- | 0xAE || PARAM_MUL_16 || Param || byte register, short value |- | 0xAF || PARAM_CMP_16 || Param || byte register, short value |- | 0xB0 || OPOVERRIDE_1 || Override || It's complicated. |- | 0xB1 || OPOVERRIDE_2 || Override || |- | 0xB4 || OPOVERRIDE_4 || Override || |- | 0xB8 || OPOVERRIDE_R || Override || |- | 0xC1 || OPENTRACK || Track || byte trackID &lt;= 0xF, int24 trackID |- | 0xC2 || OPENTRACKBROS || Track || |- | 0xC4 || CALL || Flow || byte condition, int24 address |- | 0xC5 || RETURN_NOARG || Flow || |- | 0xC6 || RETURN || Flow || byte condition |- | 0xC8 || JMP || Flow || int24 address |- | 0xC9 || LOOP_S || Flow || byte count |- | 0xCA || LOOP_E || Flow || |- | 0xCB || READPORT || Port || byte srcPort, byte dstRegister |- | 0xCC || WRITEPORT || Port || byte srcPort, byte dstRegister |- | 0xCD || CHECKPORTIMPORT || Port || byte srcPort |- | 0xCE || CHECKPORTEXPORT || Port || byte srcPort |- | 0xCF || CMD_WAITR || Wait || byte register |- | 0xD1 || PARENTWRITEPORT || Port || |- | 0xD2 || CHILDWRITEPORT || Port || |- | 0xD4 || SETLASTNOTE || || byte lastNoteValue |- | 0xD5 || TIMERELATE || || |- | 0xD6 || SIMPLEOSC || Oscillator || |- | 0xD7 || SIMPLEENV || Envelope || |- | 0xD8 || SIMPLEADSR || || |- | 0xD9 || TRANSPOSE || || |- | 0xDA || CLOSETRACK || Track || byte trackID |- | 0xDB || OUTSWITCH || || |- | 0xDC || UPDATESYNC || || |- | 0xDD || BUSCONNECT || Port || |- | 0xDE || PAUSESTATUS || Flow || |- | 0xDF || SETINTERRUPT || Interrupt || byte InterruptID, int24 Callback_Address |- | 0xE0 || DISINTERRUPT || Interrupt || |- | 0xE1 || CLRI || Interrupt || |- | 0xE2 || SETI || Interrupt || |- | 0xE3 || RETI || Interrupt || |- | 0xE4 || INTTIMER || Interrupt || |- | 0xE5 || VIBDEPTH || || |- | 0xE6 || VIBDEPTHMIDI || || |- | 0xE7 || SYNCCPU || Flow || short syncdata? |- | 0xE8 || FLUSHALL || || |- | 0xE9 || FLUSHRELEASE || || |- | 0xEA || WAIT_VLQ || Wait || VLC delay |- | 0xEB || PANPOWSET || || |- | 0xEC || IIRSET || || |- | 0xED || FIRSET || || |- | 0xEE || EXTSET || || |- | 0xEF || PANSWSET || || |- | 0xF0 || OSCROUTE || || |- | 0xF1 || IIRCUTOFF || || |- | 0xF2 || OSCFULL || || |- | 0xF3 || VOLUMEMODE || || |- | 0xF4 || VIBPITCH || || |- | 0xFA || CHECKWAVE || || |- | 0xFB || PRINTF || PrintF || Variable |- | 0xFC || NOP || Misc || Skips this opcode, can be used for patching things out |- | 0xFD || TEMPO || Flow || int16 Tempo |- | 0xFE || TIMEBASE || Flow || int16 Timebase |- | 0xFF || FINISH || Track || |} be7125b189b8f9d6cf58be19eb66519d0b88c1ed 68 67 2022-03-12T22:30:14Z Xayr 1 wikitext text/x-wiki <b>Binary Musical Sequence</b> I don't have problems, you have problems. __TOC__ ==Tracks== Tracks are an independent "thread" that will execute BMS instructions alongside other tracks. A track can have up to 16 children, all of which must be other tracks. Each track has * 24 Registers * 7 voices * Its own stack / address history * Its own instrument / bank selection * Its own independent wait timer etc. A BMS file is opened by the "root track" which is the start of the file opening up a bunch of child tracks. [[Image:BMS_OpenTrack.png]] The root track usually sits and controls stuff like the tempo, while the child tracks will do the actual playing of music. BMS will execute instructions on a track endlessly and all at once until the track has either been terminated, paused, or ESPECIALLY <b>if the wait timer is > 0</b> ==The Instruction Set== {| class="wikitable" ! Instruction || Mnemonic || Type || Additional Arguments |- | 0x00 - 0x80 || NOTE_ON || NoteOn || Variable |- | 0x80 || CMD_WAIT8 || Wait || int8 LEN, |- | 0x81 || NOTE_OFF || NoteOff || None |- | 0x88 || CMD_WAIT16 || Wait || int16 LEN |- | 0x90 || SETPARAM_90 || Param || byte Destination Register, byte Value |- | 0x91 || SETPARAM_91 || Param || byte Destination Register, byte Value |- | 0x92 || SETPARAM_92 || Param || byte Destination Register, byte Value |- | 0x94 || PERF_U8_NODUR || Perf || byte PERFValue, byte value |- | 0x96 || PERF_U8_DUR_U8 || Perf || byte PERFValue, byte value, byte duration |- | 0x97 || PERF_U8_DUR_U16 || Perf || byte PERFValue, byte value, short duration |- | 0x98 || PERF_S8_NODUR || Perf || byte PERFValue, sbyte value |- | 0x9A || PERF_S8_DUR_U8 || Perf || byte PERFValue, sbyte value, byte duration |- | 0x9B || PERF_S8_DUR_U16 || Perf || byte PERFValue, sbyte value, short duration |- | 0x9C || PERF_S16_NODUR || Perf || byte PERFValue, short value |- | 0x9D || PERF_S16_DUR_U8 || Perf || byte PERFValue, short value, byte duration |- | 0x9E || PERF_S16_DUR_U8_9E || Perf || byte PERFValue, short value, byte duration |- | 0x9F || PERF_S16_DUR_U16 || Perf || byte PERFValue, short value, short duration |- | 0xA0 || PARAM_SET_R || Param || byte dest_register, byte src_register |- | 0xA1 || PARAM_ADD_R || Param || byte dest_register, byte src_register |- | 0xA2 || PARAM_MUL_R || Param || byte dest_register, byte src_register |- | 0xA3 || PARAM_CMP_R || Param || byte dest_register, byte src_register |- | 0xA4 || PARAM_SET_8 || Param || byte register, byte value |- | 0xA5 || PARAM_ADD_8 || Param || byte register, byte value |- | 0xA6 || PARAM_MUL_8 || Param || byte register, byte value |- | 0xA7 || PARAM_CMP_8 || Param || byte register, byte value |- | 0xA8 || PARAM_LOAD_UNK || ? || ? |- | 0xA9 || PARAM_BITWISE || Param || |- | 0xAA || PARAM_LOADTBL || Param || |- | 0xAB || PARAM_SUBTRACT || Param || |- | 0xAC || PARAM_SET_16 || Param || byte register, short value |- | 0xAD || PARAM_ADD_16 || Param || byte register, short value |- | 0xAE || PARAM_MUL_16 || Param || byte register, short value |- | 0xAF || PARAM_CMP_16 || Param || byte register, short value |- | 0xB0 || OPOVERRIDE_1 || Override || It's complicated. |- | 0xB1 || OPOVERRIDE_2 || Override || |- | 0xB4 || OPOVERRIDE_4 || Override || |- | 0xB8 || OPOVERRIDE_R || Override || |- | 0xC1 || OPENTRACK || Track || byte trackID &lt;= 0xF, int24 trackID |- | 0xC2 || OPENTRACKBROS || Track || |- | 0xC4 || CALL || Flow || byte condition, int24 address |- | 0xC5 || RETURN_NOARG || Flow || |- | 0xC6 || RETURN || Flow || byte condition |- | 0xC8 || JMP || Flow || int24 address |- | 0xC9 || LOOP_S || Flow || byte count |- | 0xCA || LOOP_E || Flow || |- | 0xCB || READPORT || Port || byte srcPort, byte dstRegister |- | 0xCC || WRITEPORT || Port || byte srcPort, byte dstRegister |- | 0xCD || CHECKPORTIMPORT || Port || byte srcPort |- | 0xCE || CHECKPORTEXPORT || Port || byte srcPort |- | 0xCF || CMD_WAITR || Wait || byte register |- | 0xD1 || PARENTWRITEPORT || Port || |- | 0xD2 || CHILDWRITEPORT || Port || |- | 0xD4 || SETLASTNOTE || || byte lastNoteValue |- | 0xD5 || TIMERELATE || || |- | 0xD6 || SIMPLEOSC || Oscillator || |- | 0xD7 || SIMPLEENV || Envelope || |- | 0xD8 || SIMPLEADSR || || |- | 0xD9 || TRANSPOSE || || |- | 0xDA || CLOSETRACK || Track || byte trackID |- | 0xDB || OUTSWITCH || || |- | 0xDC || UPDATESYNC || || |- | 0xDD || BUSCONNECT || Port || |- | 0xDE || PAUSESTATUS || Flow || |- | 0xDF || SETINTERRUPT || Interrupt || byte InterruptID, int24 Callback_Address |- | 0xE0 || DISINTERRUPT || Interrupt || |- | 0xE1 || CLRI || Interrupt || |- | 0xE2 || SETI || Interrupt || |- | 0xE3 || RETI || Interrupt || |- | 0xE4 || INTTIMER || Interrupt || |- | 0xE5 || VIBDEPTH || || |- | 0xE6 || VIBDEPTHMIDI || || |- | 0xE7 || SYNCCPU || Flow || short syncdata? |- | 0xE8 || FLUSHALL || || |- | 0xE9 || FLUSHRELEASE || || |- | 0xEA || WAIT_VLQ || Wait || VLC delay |- | 0xEB || PANPOWSET || || |- | 0xEC || IIRSET || || |- | 0xED || FIRSET || || |- | 0xEE || EXTSET || || |- | 0xEF || PANSWSET || || |- | 0xF0 || OSCROUTE || || |- | 0xF1 || IIRCUTOFF || || |- | 0xF2 || OSCFULL || || |- | 0xF3 || VOLUMEMODE || || |- | 0xF4 || VIBPITCH || || |- | 0xFA || CHECKWAVE || || |- | 0xFB || PRINTF || PrintF || Variable |- | 0xFC || NOP || Misc || Skips this opcode, can be used for patching things out |- | 0xFD || TEMPO || Flow || int16 Tempo |- | 0xFE || TIMEBASE || Flow || int16 Timebase |- | 0xFF || FINISH || Track || |} e1a75914c9155fa44576ae37a8bce7ede2bb4f88 AAF 0 8 57 44 2022-03-12T21:49:53Z Xayr 1 wikitext text/x-wiki '''AAF''' stores sound effect, wave, instrument, and music data. AUDIO ARCHIVE FILE =AAF Header= The file's headers is composed to several int32's packed in a common format. The first int32 will always read the ID of a section. When you read 0, you stop reading. Header Entry Structure {| class="wikitable" |- ! id !! Structure !! Description |- | <center>0</center> || (none) || Tells to stop reading this section |- | <center>1</center> || (int32 offset, int32 size, int32 type) || Pointer to the BST (Binary Sound Table) |- | <center>2</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || IBNK Pointer Table |- | <center>3</center> || (int32 offset, int32 size, int32 flags) until offset = 0 then continue || WSYS Pointer Table |- | <center>4</center> || (int32 offset, int32 size, int32 type) || Pointer to BSC (Binary Sequence Collection) |- | <center>5</center> || (int32 offset, int32 size, int32 type) || Pointer to the BSM (Binary Stream Map) |} === Sample Parsing Code === <nowiki>while (true) { var ChunkID = aafRead.ReadUInt32(); switch (ChunkID) { case 0: return; case 1: case 5: case 4: case 6: case 7: { offset = aafRead.ReadUInt32(); size = aafRead.ReadUInt32(); type = aafRead.ReadUInt32(); break; } case 2: // INST { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } } break; case 3: // WSYS { while (true) { var offset = aafRead.ReadUInt32(); if (offset == 0) break; // 0 means we reached the end. var size = aafRead.ReadUInt32(); var type = aafRead.ReadUInt32(); } break; } } }</nowiki> 836093d7b33bda8c32f6c466142b57da86d8191f AW 0 10 58 39 2022-03-12T21:50:08Z Xayr 1 wikitext text/x-wiki AUDIO WAVE The .AW file is a raw cluster of mostly unpadded ADPCM4 data. This file is completely useless by itself, to parse it, you need a [[WSYS]] a58c44b6fd39be271e5f3597b085baa7c79bbe59 ASN 0 12 59 48 2022-03-12T21:50:31Z Xayr 1 wikitext text/x-wiki <b>Audio Sound Names</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1c</center> || short || categoryID || Count of sounds |- | <center>0x20</center> || short || Category Index || Category Index |- |} 0f6e8f642253e8877aaf337d18b32584c75cbdb6 69 59 2022-03-13T04:41:10Z Xayr 1 wikitext text/x-wiki <b>Audio Sound Names</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== Note: Categories MUST be sorted by their ID before they are read. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1c</center> || short || categoryID || Count of sounds |- | <center>0x20</center> || short || Category Index || Category Index |- |} 3359ec5aecfa16235283b6040ba0a4847e8e9c4f 70 69 2022-03-13T04:48:19Z Xayr 1 wikitext text/x-wiki <b>Audio Sound Names</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1c</center> || short || length || Count of sounds |- | <center>0x20</center> || short || categoryID || Category Index |- | <center>Not Inline</center> || waves[length] || waves || Waves |- |} After all of the categories are parsed, you can start parsing waves. ==Waves== Note: You must sort the categories by their ID before reading the names. The names are packed back-to-back. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1C</center> || short || accessMode || Access mode indicator |- | <center>0x1E</center> || short || id || WaveID |- |} e97f2a79c00a7c3db5d2bb1cf108917e42013d81 71 70 2022-03-13T04:48:32Z Xayr 1 wikitext text/x-wiki <b>Audio Sound Names</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte[0x0E] || 0 || Zero padding |- | <center>0x0E</center> || short || soundCount || Count of sounds |- | <center>0x10</center> || [[ASN#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1c</center> || short || length || Count of sounds |- | <center>0x2E</center> || short || categoryID || Category Index |- | <center>Not Inline</center> || waves[length] || waves || Waves |- |} After all of the categories are parsed, you can start parsing waves. ==Waves== Note: You must sort the categories by their ID before reading the names. The names are packed back-to-back. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || char[0x1c] || name || Name |- | <center>0x1C</center> || short || accessMode || Access mode indicator |- | <center>0x1E</center> || short || id || WaveID |- |} 42890ce798a815b12b2c48e108577c4a86f92532 File:BMS OpenTrack.png 6 16 66 2022-03-12T22:27:50Z Xayr 1 wikitext text/x-wiki da39a3ee5e6b4b0d3255bfef95601890afd80709 BST 0 17 72 2022-03-13T05:05:15Z Xayr 1 Created page with "<b>Binary Sound Table</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || version=6 || Version |- | <center>0x01</center> || byte[0x3] || 0 || Zero padding |- | <center>0x04</center> || short || entryCount || Version |- | <center>0x06</center> || [[BST#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offs..." wikitext text/x-wiki <b>Binary Sound Table</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || version=6 || Version |- | <center>0x01</center> || byte[0x3] || 0 || Zero padding |- | <center>0x04</center> || short || entryCount || Version |- | <center>0x06</center> || [[BST#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || short || length || Count of sounds |- | <center>+0x02</center> || short || startID || ID of first sound |- | <center>Not Inline</center> || waves[length] || waves || Waves |- |} After all of the categories are parsed, you can start parsing waves. ==Waves== Note: You must sort the categories by their startID before reading the names. The waves are packed back-to-back. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || unknown || unknown |- | <center>0x01</center> || byte || unknown || unknown |- | <center>0x02</center> || byte || unknown || unknown |- | <center>0x03</center> || byte || unknown || unknown |- | <center>0x04</center> || byte || type || SoundType |- | <center>0x05</center> || byte || loadMode || Loading Method |- | <center>0x06</center> || short || unknown || unknown |- | <center>0x08</center> || float || pitch || Pitch |- | <center>0x0C</center> || short || Volume || Volume |- | <center>0x0E</center> || short || unknown || Probably padding |} 8162063aaad3675080773a7c4d049f72ed9f0b18 73 72 2022-03-13T05:05:29Z Xayr 1 wikitext text/x-wiki <b>Binary Sound Table</b> __TOC__ {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || version=6 || Version |- | <center>0x01</center> || byte[0x3] || 0 || Zero padding |- | <center>0x04</center> || short || entryCount || Version |- | <center>0x06</center> || [[BST#Category|Category]][0x12] || Categories || Category array with hardcoded arbitrary length |- |} ==Category== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || short || length || Count of sounds |- | <center>+0x02</center> || short || startID || ID of first sound |- | <center>Not Inline</center> || waves[length] || waves || Waves |- |} After all of the categories are parsed, you can start parsing waves. ==Waves== Note: You must sort the categories by their startID before reading the waves. The waves are packed back-to-back. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || byte || unknown || unknown |- | <center>0x01</center> || byte || unknown || unknown |- | <center>0x02</center> || byte || unknown || unknown |- | <center>0x03</center> || byte || unknown || unknown |- | <center>0x04</center> || byte || type || SoundType |- | <center>0x05</center> || byte || loadMode || Loading Method |- | <center>0x06</center> || short || unknown || unknown |- | <center>0x08</center> || float || pitch || Pitch |- | <center>0x0C</center> || short || Volume || Volume |- | <center>0x0E</center> || short || unknown || Probably padding |} 905d108ad0fc23f60609a9a06d705e5a5c26d384 BAS (J3D) 0 18 74 2022-03-13T05:07:00Z Xayr 1 Created page with "Don't have this fully documented Take what you will from this https://github.com/XAYRGA/bastool/blob/master/bastool/BinaryAudioSequence.cs" wikitext text/x-wiki Don't have this fully documented Take what you will from this https://github.com/XAYRGA/bastool/blob/master/bastool/BinaryAudioSequence.cs 046db4d0880bfcff9ac9e7e855af55fc7c1bd699 HED 0 19 75 2022-03-13T05:33:56Z Xayr 1 Created page with "HED (Header) is the file format for a BARC archive. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int64 || 0x2D2D2D2D42415243 'BARC----' || Magic |- | <center>0x08</center> || int32 || count || entryCount |- | <center>0x0C</center> || byte[0x4] || padding || padding (aligns to 32) |- | <center>0x10</center> || char[0x16] || path || Path to data cluster |- | <center>0x20</center> || BARC#BARCEntry | BARCEn..." wikitext text/x-wiki HED (Header) is the file format for a BARC archive. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int64 || 0x2D2D2D2D42415243 'BARC----' || Magic |- | <center>0x08</center> || int32 || count || entryCount |- | <center>0x0C</center> || byte[0x4] || padding || padding (aligns to 32) |- | <center>0x10</center> || char[0x16] || path || Path to data cluster |- | <center>0x20</center> || [[BARC#BARCEntry | BARCEntry]][count]||| Entries |- |} 0c694df983f5696c45466da27f31adffb91c27d1 76 75 2022-03-13T05:34:05Z Xayr 1 wikitext text/x-wiki HED (Header) is the file format for a BARC archive. {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int64 || 0x2D2D2D2D42415243 'BARC----' || Magic |- | <center>0x08</center> || int32 || count || entryCount |- | <center>0x0C</center> || byte[0x4] || padding || padding (aligns to 32) |- | <center>0x10</center> || char[0x16] || path || Path to data cluster |- | <center>0x20</center> || [[HED#BARCEntry | BARCEntry]][count]||| Entries |- |} 488db1fc84db16514de2edeba8ed212e5f6132e4 77 76 2022-03-13T05:40:02Z Xayr 1 wikitext text/x-wiki HED (Header) is the file format for a BARC archive. =HED= {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>0x00</center> || int64 || 0x2D2D2D2D42415243 'BARC----' || Magic |- | <center>0x08</center> || int32 || count || entryCount |- | <center>0x0C</center> || byte[0x4] || padding || padding (aligns to 32) |- | <center>0x10</center> || char[0x16] || path || Path to data cluster |- | <center>0x20</center> || [[HED#BARCEntry | BARCEntry]][count]||| Entries |- |} ==BARCEntry== {| class="wikitable" |- ! Offset !! Type !! Name !! Description |- | <center>+0x00</center> || char[0xE] || name || File Name |- | <center>+0x0E</center> || short || unknown(0xFFFF) || Unknown |- | <center>+0x10</center> || int32 || unknown || unknown |- | <center>+0x14</center> || int32 || unknown || unknown |- | <center>+0x18</center> || int32 || offset || offset into "path" (data cluster) file |- | <center>+0x1C</center> || int32 || size || File length |- |} 548fe09afd3503183086ef60d72b4ad8ce6391a7 JAudiov1 0 7 78 46 2022-03-13T05:41:42Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. __TOC__ JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> * [[AAF]] * [[AW]] * [[AFC]] * [[ASN]] * [[BAS (J3D)]] * [[BARC]] * [[BMS]] * [[BST]] * [[HED]] * [[IBNK]] * [[SFT]] * [[WSYS]] <h1>Topics</h1> * [[SoundEffect BMS]] 9f86728bd1f30847c30a0b4794695d29ab8c665a 79 78 2022-03-13T05:42:34Z Xayr 1 wikitext text/x-wiki [[Category:JAudio]] JAudio V1 was the first major revision of the audio engine for the gamecube. It's roots are in the game Pikmin, where a questionable implementation of it was used for sound effects and music. __TOC__ JAudioV1 in its complete form can be found in the following games and softwares, in chronological order * Pikmin 1 * Gamecube IPL / Bios * Luigi's Mansion * Super Mario Sunshine * The Legend of Zelda: Windwaker * Pikmin 2 <h1>Formats</h1> * [[AAF]] * [[AW]] * [[AFC]] * [[ASN]] * [[BAS (J3D)]] * [[BARC]] * [[BMS]] * [[BST]] * [[HED]] * [[IBNK]] * [[SFT]] * [[WSYS]] <h1>Topics</h1> * [[SoundEffect BMS]] * [[WSYS Scene Management]] * [[SoundTable Quirks]] ce9dcecdc71b246f936470337c6a59e8d66fd66a